package com.bzkj.basicinfo.service.stock;

import com.bzkj.common.core.domain.AjaxResult;
import java.math.BigDecimal;

/**
 * WMS库存管理服务接口
 *
 * @author WMS
 * @date 2025-10-23
 */
public interface WmsStockService {

    /**
     * 增加库存
     * @param productId 商品ID
     * @param productCode 商品编码
     * @param productName 商品名称
     * @param batchCode 批次号
     * @param locationCode 货位编码
     * @param quantity 数量
     * @param bizType 业务类型
     * @param bizNo 业务单号
     * @param operator 操作人
     * @return 操作结果
     */
    AjaxResult increaseStock(String productId, String productCode, String productName,
                           String batchCode, String locationCode, BigDecimal quantity,
                           String bizType, String bizNo, String operator);

    /**
     * 减少库存
     * @param productId 商品ID
     * @param productCode 商品编码
     * @param productName 商品名称
     * @param batchCode 批次号
     * @param locationCode 货位编码
     * @param quantity 数量
     * @param bizType 业务类型
     * @param bizNo 业务单号
     * @param operator 操作人
     * @return 操作结果
     */
    AjaxResult decreaseStock(String productId, String productCode, String productName,
                           String batchCode, String locationCode, BigDecimal quantity,
                           String bizType, String bizNo, String operator);

    /**
     * 锁定库存
     * @param productId 商品ID
     * @param batchCode 批次号
     * @param locationCode 货位编码
     * @param quantity 锁定数量
     * @param lockType 锁定类型
     * @param relatedOrderNo 关联单据号
     * @param relatedOrderType 关联单据类型
     * @param operator 操作人
     * @return 操作结果
     */
    AjaxResult lockStock(String productId, String batchCode, String locationCode,
                       BigDecimal quantity, String lockType, String relatedOrderNo,
                       String relatedOrderType, String operator);

    /**
     * 解锁库存
     * @param lockNo 锁定编号
     * @param operator 操作人
     * @return 操作结果
     */
    AjaxResult unlockStock(String lockNo, String operator);

    /**
     * 检查库存是否充足
     * @param productId 商品ID
     * @param batchCode 批次号
     * @param locationCode 货位编码
     * @param requiredQuantity 需要数量
     * @return 检查结果
     */
    boolean checkStockSufficient(String productId, String batchCode, String locationCode, BigDecimal requiredQuantity);

    /**
     * 查询可用库存
     * @param productId 商品ID
     * @param batchCode 批次号
     * @param locationCode 货位编码
     * @return 可用数量
     */
    BigDecimal getAvailableStock(String productId, String batchCode, String locationCode);

    /**
     * 根据商品ID查询总可用库存
     * @param productId 商品ID
     * @return 可用库存总量
     */
    BigDecimal getAvailableStockByProductId(String productId);
}